根据科普中国的定义,缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。 由于特定的工作流程,使用者必须在创建Cache或者获取数据时指定不存在数据时应当怎么获取数据。
Guava -- 集合类 和 Guava Caches 1. 什么是 Guava Guava 是 google 推出的一个第三方 java 库,用来代替 jdk 的一些公共操作,给我印象特别深的就是 Collection 的扩展和本地缓存的扩展这两个方面了。 Cache的get方法有两个参数,第一个参数是要从Cache中获取记录的key,第二个记录是一个Callable对象。当缓存中已经存在key对应的记录时,get方法直接返回key对应的记录。 查询监控状态 可以对Cache的命中率、加载数据时间等信息进行统计。在构建Cache对象时,可以通过CacheBuilder的recordStats方法开启统计信息的开关。 开关开启后Cache会自动对缓存的各种操作进行统计,调用Cache的stats方法可以查看统计后的信息。
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式。类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. 配置缓存 这里采用guava cache作为本地缓存。将guava cache注册到cacheManger里就可以调用了。 1.配置cacheManger 首先针对要缓存的类型,配置缓存策略。 , Caffeine, Guava caches and JSR-107 compliant caches (e.g. 比如DK java.util.concurrent.ConcurrentMap based caches, Ehcache 2.x, Gemfire cache, Caffeine, Guava caches 默认的,cache代理不会lock并且同样的数据也许会计算多次,这与cache的目标相悖。 在这些特殊的场景,当计算的时候,参数sync可以用来通知将cache lock cache entry.
public class GuavaCacheDemo { private Cache<String, Man> cache; private LoadingCache<String,Man 刷新:主动刷新方法LoadingCache.referesh(K) 信息统计:CacheBuilder.recordStats() 开启Guava Cache的统计功能。 Cache.stats() 返回CacheStats对象。 (其中包括命中率等相关信息) 获取当前缓存所有数据:cache.asMap(),cache.asMap().get(Object)会刷新数据的访问时间(影响的是:创建时设置的在多久没访问后删除数据) LocalManualCache 我认为在缓存数据有很多种类的时候采用第一种cache。而数据单一,数据库数据会定时刷新时采用第二种cache。
ReferenceEntry ReferenceEntry是guava-cache中实际进行存储的数据结构,其类图: 那么在初始状态下,每个Segment中有多少个ReferenceEntry呢? ReHash guava cache采用了和ConcurrentHashMap同样的算法。 cache也是采用链表的形式解决hash冲突的。 cache扩容仍然采用了ConcurrentHashMap的思想。 高并发下数据写入与过期 总结 Guava cache其实是在ConcurrentHashMap的基础上加入了过期、权重、自动刷新等特性。
(Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。 如果这不符合你的需求,请尝试Memcached这类工具) 如果你的场景符合上述的每一条,Guava Cache就适合你。 Guava Cache提供了三种基本的缓存回收方式:基于容量回收、定时回收和基于引用回收。 其他特性 统计 CacheBuilder.recordStats()用来开启Guava Cache的统计功能。 如上所述,Guava Cache在某种意义上支持中断。
项目中经常使用Guava Cache,根据经验总结了一些最佳实践。 evicted because of size in guava cache: {}", notification.getKey()); break; case model evicted because of explicit in guava cache: {}", notification.getKey()); break; case REPLACED: log.info("model updated because of replaced in guava cache: {}", notification.getKey 走近Guava(五): 缓存 Guava Cache -- Java 应用缓存神器
摘要: 学习Google内部使用的工具包Guava,在Java项目中轻松地增加缓存,提高程序获取数据的效率。 一、什么是缓存? demo中,分别采用了Guava自带的两个Cache:LocalLoadingCache和LocalManualCache。 GuavaCache分为两种Cache:Cache,LoadingCache。LoadingCache继承了Cache,他比Cache主要多了get和refresh方法。多这两个方法能干什么呢? 刷新:主动刷新方法LoadingCache.referesh(K) 信息统计:CacheBuilder.recordStats() 开启Guava Cache的统计功能。 peida/... https://github.com/tiantianga... http://www.blogjava.net/DLevi... http://ifeve.com/google-guava
在 java 环境下,最常见的一种开源缓存框架要数 guava cache 了。简单的配置与优秀的性能,让它得到了广大 java 程序员的青睐。 2. guava cache 的使用 guava cache 的使用非常简单,下面是一个 sample: LoadingCache<String, String> cache = CacheBuilder.newBuilder cache 通过 load 方法获取数据,而当缓存中存在数据但已失效后,guava cache 则改为通过 reload 方法获取数据。 6.1 创建 guava cache 对象 基于上述实战代码,我们在 load 方法中增加 sleep 代码,来模拟数据源获取耗时的情况: LoadingCache<String, String> cache 那么,guava cache 是如何做到上述机制的呢?敬请期待下一篇文章,让我来深入 guava cache 的源码,详细为您解读。
背景 上一篇文章中,我们详细介绍了 guava cache 的使用方法,尤其是在其中重点介绍了 guava cache 异步回种的用法,那么,性能优异的异步回种缓存究竟是如何实现的呢? 本文我们就来详细阅读 guava cache 的完整流程代码,抽丝剥茧,学习其中的思想与智慧。 guava cache 用法详解 2. 基本思想 guava cache 异步回种基本思想: cache.get() 完整流程图: 3. guava cache 在上述情况下调用 lockedGetOrLoad() 方法获取数据,这个方法中,通过加 AQS 锁避免多个线程同时 load 获取数据,然后通过回调 load() 方法同步获取数据 总结 了解了 guava cache 异步回种的基本思想,也许你会觉得这一套解决方案的实现是如此简单,那么,我们知道,memcache、redis 都是只有提供了同步接口的,那么,你是否可以在此基础上实现一套异步回种方案呢
先简单介绍一下 Guava Cache,它是 Google 封装的基础工具包 guava 中的一个内存缓存模块,它主要提供了以下能力: 封装了缓存与数据源交互的流程,使得开发更关注于业务操作 提供线程安全的存取操作 实际上,Guava Cache 默认采取了 LRU 缓存淘汰策略。 总结 本文介绍了 Guava Cache 一些常用的 API 、用法示例,以及需要警惕的一些使用误区。 总之非常灵活,使用 Guava Cache 的 API 可以满足大多数业务场景的缓存需求。 为什么是 Guava Cache,它的性能怎么样? 我现在主要是出于稳定性考虑,项目一直在使用 Guava Cache。据说有比 Guava Cache 快的本地缓存,但那点性能我的系统不是特别关心。 - END -
缓存的key被封装在WeakReference引用内 缓存的Value被封装在WeakReference或SoftReference引用内 统计缓存使用过程中命中率、异常率、未命中率等统计数据 Guava Guava Cache数据结构图 ? ReferenceEntry是对一个键值对节点的抽象,它包含了key和值的ValueReference抽象类。 WriteQueue和AccessQueue 为了实现最近最少使用算法,Guava Cache在Segment中添加了两条链:write链(writeQueue)和access链(accessQueue ) .weakValues() .build(); cache.put("word","Hello Guava Cache"); System.out.println(cache.getIfPresent return "result"; } }); System.out.println(result); } 总结 Guava Cache基于ConcurrentHashMap
缓存使用模式 Cache-Aside 即业务代码围绕缓存来写,由业务代码直接维护缓存; Cache-As-SoR 即把Cache看做 SoR,所有操作都是对Cache进行,然后Cache再委托给SoR进行真实的读 有三种实现: ① read-through:代码首先调用Cache,如果Cache不命中由Cache回源到SoR,而不是业务代码(即由Cache 读SoR)。 使用Read-Through 模式,需要配置一个CacheLoader组件用来回源到SoR加载源数据.Guava Cache和Ehcache 3.x都支持该模式,下面会有实现; ② write-through Guava-Cache简单实现 public class CacheTest { static AtomicInteger ac = new AtomicInteger(1); public statsCounter.recordMisses(1); } } else { return waitForLoadingValue(e, key, valueReference); } } 这是Guava-Cache
准备记录一下自己对Guava Cache的认识及项目中的实际使用经验. (Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。 在pom文件中引入Guava Cache的坐标: <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</ () 三: 使用实例 这里更新下我在项目中常用的guava cache的实例. 好了 知道了这些就可以在项目中直接使用了, 更多的内容请看Guava Cache官方文档(翻译版):http://ifeve.com/google-guava-cachesexplained/
Ehcache、Guava Cache 所以出现了一些专门用作 JVM 缓存的开源工具出现了,如本文提到的 Guava Cache。 Guava Cache 示例 之所以想到 Guava 的 Cache,也是最近在做一个需求,大体如下: 从 Kafka 实时读取出应用系统的日志信息,该日志信息包含了应用的健康状况。 对此 Guava 的 Cache 就非常适合,我利用了它的 N 个时间内不写入数据时缓存就清空的特点,在每次读取数据时判断异常信息是否大于 X 即可。 有点类似于我之前写过的 动手实现一个 LRU cache 胡适说过:大胆假设小心论证 下面来看看 Guava 到底是怎么实现。 总结 最后再来总结下 Guava 的 Cache。
Ehcache、Guava Cache 所以出现了一些专门用作 JVM 缓存的开源工具出现了,如本文提到的 Guava Cache。 Guava Cache 示例 之所以想到 Guava 的 Cache,也是最近在做一个需求,大体如下: 从 Kafka 实时读取出应用系统的日志信息,该日志信息包含了应用的健康状况。 对此 Guava 的 Cache 就非常适合,我利用了它的 N 个时间内不写入数据时缓存就清空的特点,在每次读取数据时判断异常信息是否大于 X 即可。 有点类似于我之前写过的 动手实现一个 LRU cache 胡适说过:大胆假设小心论证 下面来看看 Guava 到底是怎么实现。 总结 最后再来总结下 Guava 的 Cache。 其实在上文跟代码时会发现通过一个 key 定位数据时有以下代码: ?
今天说的 Guava Cache 是google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中。 当然如果你不想指定重建策略,那么你可以使用无参的build()方法,它将返回Cache类型的构建对象。 CacheBuilder 是Guava 提供的一个快速构建缓存对象的工具类。 同 ConcurrentHashMap 类似Guava cache的并发也是通过分离锁实现。在一般情况下,将并发级别设置为服务器cpu核心数是一个比较不错的选择。 当Cache中的记录数量达到最大值后再调用put方法向其中添加对象,Guava会先从当前缓存的对象记录中选择一条删除掉,腾出空间后再将新的对象存储到Cache中。 Guava可以保证当有多个线程同时访问Cache中的一个key时,如果key对应的记录不存在,Guava只会启动一个线程执行get方法中Callable参数对应的任务加载数据存到缓存。
在Guava Cache中,CacheLoader是一个核心组件,用于在缓存中查找或加载数据。 Guava Cache特点 Guava Cache是一个轻量级、高性能的缓存库,它支持过期时间、缓存大小限制等特性,并且可以定制缓存的加载方式。 创建Guava Cache 接下来,我们需要创建一个Guava Cache,并指定使用CacheLoader来加载数据。 获取缓存数据 在业务代码中,我们可以通过Guava Cache来获取商品信息。 希望通过本文的介绍,读者能够更好地理解Guava Cache的工作原理和CacheLoader的应用,以及如何在实际项目中应用Guava Cache来提高应用程序的性能。谢谢阅读!
1.1 Guava Cache:Google的缓存奠基者 Guava Cache是Google Guava库的一部分,诞生于2011年左右。 2.1 Guava Cache的LRU:简单但不够智能 Guava Cache默认使用LRU(Least Recently Used,最近最少使用)算法或其变种。 3.1 Guava Cache的分段锁策略 Guava Cache借鉴了早期ConcurrentHashMap的分段锁(Segment Lock)策略。 4.1 Guava Cache的内存使用特点 Guava Cache内部使用了一些包装对象来存储缓存条目和引用关系,这可能导致额外的内存开销: // 展示Guava Cache可能的内存开销 @Test 5.1 基本API对比 Guava Cache和Caffeine的基本API非常相似,这得益于Caffeine对Guava Cache API的兼容性设计: // Guava Cache的基本用法 public
简单从这几个方面描述一下如何使用Cache,对Cache的各种原理介绍此处不涉及. 1.使用场景 2.如何使用Cache 3.创建方式 4. 提供的guava Cache,它简单易用的同时,性能也好. LoadingCache 方式一: 1 package info.sanaulla.cache; 2 3 import com.google.common.cache.Cache; ; 2 import com.google.common.cache.CacheLoader; 3 import org.springframework.cache.Cache; 4 import 地址:https://github.com/raphw/guava-cache-overflow-extension